/**
* Copyright (c) 2022 - present TinyVue Authors.
* Copyright (c) 2022 - present Huawei Cloud Computing Technologies Co., Ltd.
*
* Use of this source code is governed by an MIT-style license.
*
* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
*
*/

export const computedCheckableData = ({ props }) => () => props.data.filter((item) => !item.disabled)

export const computedSelectedKeys = ({ props, state }) => () => {
  const keys = []

  state.checkableData.forEach((item) => keys.push(item[props.keys]))

  return keys
}

export const computedSelectCls = ({ state }) => () => {
  if (state.selected.length > 0 && state.selected.length >= state.checkableData.length) {
    return 'checked-sur'
  } else if (state.selected.length > 0 && state.selected.length < state.checkableData.length) {
    return 'halfselect'
  }

  return 'check'
}

export const watchDefaultChecked = ({ props, state }) => (value, oldvalue) => {
  if (oldvalue && value.length === oldvalue.length && value.every((item) => oldvalue.indexOf(item) > -1)) {
    return
  }

  const checked = []

  state.checkableData.forEach((item) => {
    const index = value.indexOf(item[props.keys])

    if (~index) {
      checked.push(item)
    }
  })

  state.selected = checked
  state.checkedChangeByUser = false
}

export const watchSelected = ({ emit, props, state }) => (value, oldvalue) => {
  const keys = []

  value.forEach((item) => keys.push(item[props.keys]))

  if (state.checkedChangeByUser) {
    const movedKeys = value.concat(oldvalue).filter((item) => value.indexOf(item) === -1 || oldvalue.indexOf(item) === -1)

    emit('checked-change', keys, false, movedKeys)
  } else {
    emit('checked-change', keys, false)

    state.checkedChangeByUser = true
  }
}

export const selectRow = ({ emit, state }) => (row) => {
  state.selectedRow = row
  emit('radio-change', row)
}

export const togeSelected = ({ state }) => (row) => {
  if (row.disabled) {
    return
  }

  const index = state.selected.indexOf(row)

  if (index !== -1) {
    state.selected.splice(index, 1)
  } else {
    state.selected.push(row)
  }

  state.selected = state.selected.slice()
}

export const togeSelectAll = ({ emit, props, state }) => () => {
  let data = []

  if (state.selectCls === 'checked-sur') {
    state.selected = []
    data = []
  } else {
    data = state.checkableData.map((item) => item[props.keys])
    state.selected = state.checkableData
  }

  emit('checked-change', data, true)
}
